/**
*	file Monster.h
*	\brief Module qui gere les monstres
*	\author Ostapenco Vladimir, Gehin Maxime
*	\version 1.0
*	\date 16/12/2013
*	Le module terrain est utilisé pour extraire un terrain d'un fichier texte, ansi que pour les collision.
*/

#ifndef monster_h
#define monster_h

#include "Terrain.h"

/**
* \struct Monster
* \brief structure qui contient les monstres
*/
typedef struct{
	int id;
	char * name;
	int level;
	int maxhp;
	int curhp;
	int power;
	unsigned int xp;
	int radius;
	int x;
	int y;
	int x_std;
	int y_std;
	int direction;
	enum {M_ALIVE, M_DEAD, M_COMBAT} mode;
	float cooldown;
	int last_damage;
	int speed;
	float cooldown_move;
	int speed_move;
	float cooldown_respawn;
	int respawn;
	int terrainid;
}Monster;

/** 
*	monsterTabInit renvoie un tableau de monstre qui dependra d'un terrain
*	\param nb IN-OUT : nombre de monstres initialisés
*	\param terId : terrain dans lequel le tableau de monstre est initialisé
*/
Monster * monsterTabInit(int *,int);

/** fonction qui iniialise un monstre*/
void monsterInitUnMonstre(Monster *);

/**fonctions qui libère le tableau de monstre*/
void monsterFree(Monster *,int);

/** fonction qui gere les mouvements des monstres*/
void monsterMove(Monster *,Terrain *);

/**renvoie 0.5*power du monstre*/
int monsterAttack(Monster *);

/**fonction qui gere les degat reçus par le monstre*/
void monsterTakeDamage(Monster *, int);

/**fonction qui gere le respawn des mobs*/
void monsterNeedRespawn(Monster *,float);

/**renvoie le mode du monstre(en vie, en combat ou mort*/
int monsterGetMode(const Monster *);

/**fonction qui renvoie les derniers degats subis par le monstre*/
int monsterGetLastDamage(const Monster *);

/** renvoie les coordonnées x et y d'un monstre*/
void monsterGetPos(const Monster *, int * x, int * y);

/**renvoie le cooldown de l'attaque d'un monstre*/
float monsterGetCooldownAttack(const Monster *);

/** renvoie le cooldown pour les mouvement d'un monstre*/
float monsterGetCooldownMove(const Monster *);

/**  renvoie l'xp que donne un monstre a sa mort*/
int monsterGetExp(const Monster *);

/** renvoie le nom du monstre*/
char * monsterGetName(const Monster *);

/** renvoie les hp actuels du monstre*/
int monsterGetCurHP(const Monster *);

/** renvoie les hp max du montre*/
int monsterGetMaxHP(const Monster *);

/**renvoie la vitesse d'attaque d'un monstre*/
int monsterGetSpeed(const Monster *);

/**renvoie l'id d'un monstre*/
int monsterGetId(const Monster *);

/** fonction qui modifie le lastdamage*/
void monstetSetLastDamage(Monster *,int);

/** fonction qui decremente le cooldown de l'attaque*/
void monsterSetCooldownAttack(Monster *,float);

/** fonction qui modifie le mode d'un monstre*/
void monsterSetMode(Monster *,int);

/** fonction qui decremente le cooldown de deplacement d'un monstre*/
void monsterSetCooldownMove(Monster *,float);

/** fonction qui modifie le cooldownmove d'un monstre*/
void monsterSetCooldownMoveAbs(Monster *,float);

/** fonction qui modifie le cooldownAttack d'un monstre*/
void monsterSetCooldownAttackAbs(Monster *,float);

/**fonction qui change la dirrection d'un monstre */
void monsterSetDirection(Monster *, int);

/** test de regression du module monstre*/
void monsterTestRegression();
#endif
